package org.skywork.dal.system;

// *************************************************************************/
// Charada Soft
// Area de Desarrollo de Sistemas de Información
// *************************************************************************/
// Proyecto : SkyWork Data Access Layer
// Archivo : ConnectorDAO.java
// Descripcion : Clase ConnectorDAO
// *************************************************************************/
// Version : 2.11.8
// Fecha de Creación: 31 de Diciembre de 2014
// Author : Daniel Andres Castillo Pedroza
// *************************************************************************/

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.sql.connector.ServerManager;
import org.sql.connector.server.MySQL;
import org.tools.segurity.Segurity;
import org.tools.segurity.cryptography.Cryptography;

public class ConnectorDAO {
    
    // Atributos estáticos de la clase ConnectorDAO
    
    private static String DIRECCION_IP;
    private static String PUERTO;
    private static String BASE_DE_DATOS;
    private static String USUARIO;
    private static String PASSWORD;
    
    // Metodos de la clase ConnectorDAO
    
    /**
     * Este método nos permite guardar los atributos para realizar la conexión con
     * el Servidor en un archivo del Equipo. Donde la ruta del archivo se establece con un
     * objeto <code>String</code> y los atributos con un <code>MySQL</code>.
     * 
     * @param rootFile Ruta del Archivo para guardar atributos
     * @param mySQL Objeto que contiene los atributos para la Conexión
     * @return Retorna el resultado del proceso en un dato <code>boolean</code>.
     */
    public static boolean guardarAtributosDeConexion(String rootFile, MySQL mySQL) {
        try {
            // Declarando, configurando objetos para el Proceso
            FileOutputStream fileOutputStream = new FileOutputStream(rootFile);
            DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream);
            
            // Creando dato para guardar Atributos de la Conexión en el Archivo
            String datosConexion = mySQL.getAddressIP();
            datosConexion = datosConexion + ";" + mySQL.getPort();
            datosConexion = datosConexion + ";" + mySQL.getDataBase();
            datosConexion = datosConexion + ";" + mySQL.getUser();
            datosConexion = datosConexion + ";" + mySQL.getPassword();
            
            // Configurando linea de conexión con Protocolos de Seguridad
            datosConexion = Segurity.encryptData(datosConexion);
            dataOutputStream.writeUTF(Cryptography.encryptData(datosConexion,"SkyWork"));
            
            // Cerrando el Flujo de Archivos del Sistema
            dataOutputStream.close(); fileOutputStream.close(); return true;
        } 
        
        catch (FileNotFoundException ex) {
            System.out.println(ex.getMessage()); return false;
        } 
        
        catch (IOException ex) {
            System.out.println(ex.getMessage()); return false;
        } 
    }
    
    /**
     * Este método nos permite cargar los atributos para realizar la conexión con
     * el Servidor de un archivo del Equipo. Donde la ruta del archivo se establece con un
     * obejto <code>String</code>.
     * 
     * @param rootFile Ruta del Archivo para cargar atributos
     * @return Retorna el resultado del proceso en un dato <code>boolean</code>.
     */
    public static boolean cargarAtributosDeConexion(String rootFile) {
        try {
            // Declarando, configurando objetos para el Proceso
            FileInputStream fileInputStream = new FileInputStream(rootFile);
            DataInputStream dataInput = new DataInputStream(fileInputStream);
            
            // Cargando Atributos de la Conexión del Archivo
            String datos = Cryptography.decryptData(dataInput.readUTF(),"SkyWork");
            String [] datosConexion = Segurity.decryptData(datos).split(";");
            DIRECCION_IP = datosConexion[0]; PUERTO = datosConexion[1];
            BASE_DE_DATOS = datosConexion[2]; USUARIO = datosConexion[3];
            PASSWORD = datosConexion[4];
            
            // Cerrando el Flujo de Archivos del Sistema
            dataInput.close(); fileInputStream.close(); return true;
        }
        
        catch (FileNotFoundException ex) {
            System.out.println(ex.getMessage()); return false;
        } 
        
        catch (IOException ex) {
            System.out.println(ex.getMessage()); return false;
        }
    }
    
    /**
     * Este método nos retorna el objeto que administrar la conexión con el Servidor.
     * @return Retorna el administrador en un objeto <code>ServerManager</code>.
     */
    public static ServerManager getServer() {
      // Instanciando objetos para el Proceso de Conexión
      ServerManager server = new ServerManager(); MySQL mysql = new MySQL();
      
      // Configurando objeto para la Conexión con el Servidor
      mysql.setAddressIP(DIRECCION_IP); mysql.setPort(PUERTO);
      mysql.setDataBase(BASE_DE_DATOS); mysql.setUser(USUARIO);
      mysql.setPassword(PASSWORD); server.setAttribs(mysql);
      
      return server; // Retornando objeto de Conexión
    }
}